const crypto = require("crypto");

/*
 下面是使用加密算法
*/

// 创建加密算法
const aseEncode = function (data, password) {
	// 如下方法使用指定的算法与密码来创建cipher对象
	const cipher = crypto.createCipher("aes192", password);

	// 使用该对象的update方法来指定需要被加密的数据
	let crypted = cipher.update(data, "utf-8", "hex");

	crypted += cipher.final("hex");

	return crypted;
};

// 创建解密算法
const aseDecode = function (data, password) {
	/* 
   该方法使用指定的算法与密码来创建 decipher对象, 第一个算法必须与加密数据时所使用的算法保持一致;
   第二个参数用于指定解密时所使用的密码，其参数值为一个二进制格式的字符串或一个Buffer对象，该密码同样必须与加密该数据时所使用的密码保持一致
  */
	const decipher = crypto.createDecipher("aes192", password);

	/*
   第一个参数为一个Buffer对象或一个字符串，用于指定需要被解密的数据
   第二个参数用于指定被解密数据所使用的编码格式，可指定的参数值为 'hex', 'binary', 'base64'等，
   第三个参数用于指定输出解密数据时使用的编码格式，可选参数值为 'utf-8', 'ascii' 或 'binary';
  */
	let decrypted = decipher.update(data, "hex", "utf-8");

	decrypted += decipher.final("utf-8");
	return decrypted;
};

const defaultSalt = "abcde";

exports.getToken = function getToken(token, uid) {
	if (!token) throw new Error("token 不能为空");
	yapi_configs.passsalt = yapi_configs.passsalt || defaultSalt;
	return aseEncode(uid + "|" + token, yapi_configs.passsalt);
};

exports.parseToken = function parseToken(token) {
	if (!token) throw new Error("token 不能为空");
	yapi_configs.passsalt = yapi_configs.passsalt || defaultSalt;
	let tokens;
	try {
		tokens = aseDecode(token, yapi_configs.passsalt);
	} catch (e) {}
	if (tokens && typeof tokens === "string" && tokens.indexOf("|") > 0) {
		tokens = tokens.split("|");
		return {
			uid: tokens[0],
			projectToken: tokens[1]
		};
	}
	return false;
};
